--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Release/esptool/spiffsgen.py 4564dc3e9e5bf1072fdec4ae7482520e7cdf0e09 (4564dc3e) Text, 23.77 KB
T8b949e#!/usr/bin/env python
T8b949e#
T8b949e# spiffsgen is a tool used to generate a spiffs image from a directory
T8b949e#
T8b949e# SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
T8b949e# SPDX-License-Identifier: Apache-2.0
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3divisionTb4b4b4, Te6edf3print_function
Tff7b72import T7ee787argparse
Tff7b72import T7ee787io
Tff7b72import T7ee787math
Tff7b72import T7ee787os
Tff7b72import T7ee787struct
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787typing
Te6edf3TSP Tff7b72= Te6edf3typingTff7b72.Td2a8ffTypeVarTb4b4b4(Ta5d6ff'Ta5d6ffTSPTa5d6ff'Tb4b4b4, Te6edf3boundTff7b72=Ta5d6ff'Ta5d6ffSpiffsObjPageWithIdxTa5d6ff'Tb4b4b4)
Te6edf3ObjIdsItem Tff7b72= Te6edf3typingTff7b72.Td2a8ffTupleTb4b4b4[Tffa657intTb4b4b4, Te6edf3typingTff7b72.Td2a8ffTypeTb4b4b4[Te6edf3TSPTb4b4b4]Tb4b4b4]
Tff7b72except Tf85149ImportErrorTb4b4b4:
Tff7b72pass
Te6edf3SPIFFS_PH_FLAG_USED_FINAL_INDEX Tff7b72= T79c0ff0xF8
Te6edf3SPIFFS_PH_FLAG_USED_FINAL Tff7b72= T79c0ff0xFC
Te6edf3SPIFFS_PH_FLAG_LEN Tff7b72= T79c0ff1
Te6edf3SPIFFS_PH_IX_SIZE_LEN Tff7b72= T79c0ff4
Te6edf3SPIFFS_PH_IX_OBJ_TYPE_LEN Tff7b72= T79c0ff1
Te6edf3SPIFFS_TYPE_FILE Tff7b72= T79c0ff1
T8b949e# Based on typedefs under spiffs_config.h
Te6edf3SPIFFS_OBJ_ID_LEN Tff7b72= T79c0ff2 T8b949e# spiffs_obj_id
Te6edf3SPIFFS_SPAN_IX_LEN Tff7b72= T79c0ff2 T8b949e# spiffs_span_ix
Te6edf3SPIFFS_PAGE_IX_LEN Tff7b72= T79c0ff2 T8b949e# spiffs_page_ix
Te6edf3SPIFFS_BLOCK_IX_LEN Tff7b72= T79c0ff2 T8b949e# spiffs_block_ix
Tff7b72class T56d364SpiffsBuildConfigTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4,
Te6edf3page_sizeTb4b4b4, T8b949e# type: int
Te6edf3page_ix_lenTb4b4b4, T8b949e# type: int
Te6edf3block_sizeTb4b4b4, T8b949e# type: int
Te6edf3block_ix_lenTb4b4b4, T8b949e# type: int
Te6edf3meta_lenTb4b4b4, T8b949e# type: int
Te6edf3obj_name_lenTb4b4b4, T8b949e# type: int
Te6edf3obj_id_lenTb4b4b4, T8b949e# type: int
Te6edf3span_ix_lenTb4b4b4, T8b949e# type: int
Te6edf3packedTb4b4b4, T8b949e# type: bool
Te6edf3alignedTb4b4b4, T8b949e# type: bool
Te6edf3endiannessTb4b4b4, T8b949e# type: str
Te6edf3use_magicTb4b4b4, T8b949e# type: bool
Te6edf3use_magic_lenTb4b4b4, T8b949e# type: bool
Te6edf3aligned_obj_ix_tables T8b949e# type: bool
Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3block_size Tff7b72% Te6edf3page_size Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff'Ta5d6ffblock size should be a multiple of page sizeTa5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpage_size Tff7b72= Te6edf3page_size
Tff7b72selfTff7b72.Td2a8ffblock_size Tff7b72= Te6edf3block_size
Tff7b72selfTff7b72.Td2a8ffobj_id_len Tff7b72= Te6edf3obj_id_len
Tff7b72selfTff7b72.Td2a8ffspan_ix_len Tff7b72= Te6edf3span_ix_len
Tff7b72selfTff7b72.Td2a8ffpacked Tff7b72= Te6edf3packed
Tff7b72selfTff7b72.Td2a8ffaligned Tff7b72= Te6edf3aligned
Tff7b72selfTff7b72.Td2a8ffobj_name_len Tff7b72= Te6edf3obj_name_len
Tff7b72selfTff7b72.Td2a8ffmeta_len Tff7b72= Te6edf3meta_len
Tff7b72selfTff7b72.Td2a8ffpage_ix_len Tff7b72= Te6edf3page_ix_len
Tff7b72selfTff7b72.Td2a8ffblock_ix_len Tff7b72= Te6edf3block_ix_len
Tff7b72selfTff7b72.Td2a8ffendianness Tff7b72= Te6edf3endianness
Tff7b72selfTff7b72.Td2a8ffuse_magic Tff7b72= Te6edf3use_magic
Tff7b72selfTff7b72.Td2a8ffuse_magic_len Tff7b72= Te6edf3use_magic_len
Tff7b72selfTff7b72.Td2a8ffaligned_obj_ix_tables Tff7b72= Te6edf3aligned_obj_ix_tables
Tff7b72selfTff7b72.Td2a8ffPAGES_PER_BLOCK Tff7b72= Tff7b72selfTff7b72.Td2a8ffblock_size Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffpage_size
Tff7b72selfTff7b72.Td2a8ffOBJ_LU_PAGES_PER_BLOCK Tff7b72= Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8ffceilTb4b4b4(Tff7b72selfTff7b72.Td2a8ffblock_size Tff7b72/ Tff7b72selfTff7b72.Td2a8ffpage_size Tff7b72* Tff7b72selfTff7b72.Td2a8ffobj_id_len Tff7b72/ Tff7b72selfTff7b72.Td2a8ffpage_sizeTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffOBJ_USABLE_PAGES_PER_BLOCK Tff7b72= Tff7b72selfTff7b72.Td2a8ffPAGES_PER_BLOCK Tff7b72- Tff7b72selfTff7b72.Td2a8ffOBJ_LU_PAGES_PER_BLOCK
Tff7b72selfTff7b72.Td2a8ffOBJ_LU_PAGES_OBJ_IDS_LIM Tff7b72= Tff7b72selfTff7b72.Td2a8ffpage_size Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffobj_id_len
Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN Tff7b72= Tff7b72selfTff7b72.Td2a8ffobj_id_len Tff7b72+ Tff7b72selfTff7b72.Td2a8ffspan_ix_len Tff7b72+ Te6edf3SPIFFS_PH_FLAG_LEN
Te6edf3pad Tff7b72= T79c0ff4 Tff7b72- Tb4b4b4(T79c0ff4 Tff7b72if Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN Tff7b72% T79c0ff4 Tff7b72== T79c0ff0 Tff7b72else Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN Tff7b72% T79c0ff4Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN_ALIGNED Tff7b72= Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN Tff7b72+ Te6edf3pad
Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD Tff7b72= Te6edf3pad
Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_CONTENT_LEN Tff7b72= Tff7b72selfTff7b72.Td2a8ffpage_size Tff7b72- Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN_ALIGNED Tff7b72+ Te6edf3SPIFFS_PH_IX_SIZE_LEN Tff7b72+
Te6edf3SPIFFS_PH_IX_OBJ_TYPE_LEN Tff7b72+ Tff7b72selfTff7b72.Td2a8ffobj_name_len Tff7b72+ Tff7b72selfTff7b72.Td2a8ffmeta_lenTb4b4b4)
Tff7b72if Te6edf3aligned_obj_ix_tablesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNED Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN Tff7b72+ Te6edf3SPIFFS_PAGE_IX_LEN Tff7b72- T79c0ff1Tb4b4b4) Tff7b72& Tff7b72~Tb4b4b4(Te6edf3SPIFFS_PAGE_IX_LEN Tff7b72- T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD Tff7b72= Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNED Tff7b72- Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNED Tff7b72= Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_OBJ_IDS_HEAD_LIM Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffpage_size Tff7b72- Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNEDTb4b4b4) Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffblock_ix_len
Tff7b72selfTff7b72.Td2a8ffOBJ_INDEX_PAGES_OBJ_IDS_LIM Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffpage_size Tff7b72- Tff7b72selfTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN_ALIGNEDTb4b4b4) Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffblock_ix_len
Tff7b72class T56d364SpiffsFullErrorTb4b4b4(Tf85149RuntimeErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72class T56d364SpiffsPageTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:
Te6edf3_endianness_dict Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6fflittleTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff<Ta5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffbigTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff>Ta5d6ff'
Tb4b4b4}
Te6edf3_len_dict Tff7b72= Tb4b4b4{
T79c0ff1Tb4b4b4: Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4,
T79c0ff2Tb4b4b4: Ta5d6ff'Ta5d6ffHTa5d6ff'Tb4b4b4,
T79c0ff4Tb4b4b4: Ta5d6ff'Ta5d6ffITa5d6ff'Tb4b4b4,
T79c0ff8Tb4b4b4: Ta5d6ff'Ta5d6ffQTa5d6ff'
Tb4b4b4}
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bixTb4b4b4, Te6edf3build_configTb4b4b4)Tb4b4b4: T8b949e# type: (int, SpiffsBuildConfig) -> None
Tff7b72selfTff7b72.Td2a8ffbuild_config Tff7b72= Te6edf3build_config
Tff7b72selfTff7b72.Td2a8ffbix Tff7b72= Te6edf3bix
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bytes
Tff7b72raise Tf85149NotImplementedErrorTb4b4b4(Tb4b4b4)
Tff7b72class T56d364SpiffsObjPageWithIdxTb4b4b4(Te6edf3SpiffsPageTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3obj_idTb4b4b4, Te6edf3build_configTb4b4b4)Tb4b4b4: T8b949e# type: (int, SpiffsBuildConfig) -> None
Tffa657superTb4b4b4(Te6edf3SpiffsObjPageWithIdxTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(T79c0ff0Tb4b4b4, Te6edf3build_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffobj_id Tff7b72= Te6edf3obj_id
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bytes
Tff7b72raise Tf85149NotImplementedErrorTb4b4b4(Tb4b4b4)
Tff7b72class T56d364SpiffsObjLuPageTb4b4b4(Te6edf3SpiffsPageTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bixTb4b4b4, Te6edf3build_configTb4b4b4)Tb4b4b4: T8b949e# type: (int, SpiffsBuildConfig) -> None
Te6edf3SpiffsPageTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bixTb4b4b4, Te6edf3build_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffobj_ids_limit Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_LU_PAGES_OBJ_IDS_LIM
Tff7b72selfTff7b72.Td2a8ffobj_ids Tff7b72= Tffa657listTb4b4b4(Tb4b4b4) T8b949e# type: typing.List[ObjIdsItem]
Tff7b72def Td2a8ff_calc_magicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3blocks_limTb4b4b4)Tb4b4b4: T8b949e# type: (int) -> int
T8b949e# Calculate the magic value mirroring computation done by the macro SPIFFS_MAGIC defined in
T8b949e# spiffs_nucleus.h
Te6edf3magic Tff7b72= T79c0ff0x20140529 Tff7b72^ Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffuse_magic_lenTb4b4b4:
Te6edf3magic Tff7b72= Te6edf3magic Tff7b72^ Tb4b4b4(Te6edf3blocks_lim Tff7b72- Tff7b72selfTff7b72.Td2a8ffbixTb4b4b4)
T8b949e# narrow the result to build_config.obj_id_len bytes
Te6edf3mask Tff7b72= Tb4b4b4(T79c0ff2 Tff7b72<< Tb4b4b4(T79c0ff8 Tff7b72* Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_lenTb4b4b4)Tb4b4b4) Tff7b72- T79c0ff1
Tff7b72return Te6edf3magic Tff7b72& Te6edf3mask
Tff7b72def Td2a8ffregister_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pageTb4b4b4)Tb4b4b4: T8b949e# type: (TSP) -> None
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffobj_ids_limit Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3SpiffsFullErrorTb4b4b4(Tb4b4b4)
Te6edf3obj_id Tff7b72= Tb4b4b4(Te6edf3pageTff7b72.Td2a8ffobj_idTb4b4b4, Te6edf3pageTff7b72.Td2a8ff__class__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffobj_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3obj_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffobj_ids_limit Tff7b72-Tff7b72= T79c0ff1
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bytes
Te6edf3img Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'
Tff7b72for Tb4b4b4(Te6edf3obj_idTb4b4b4, Te6edf3page_typeTb4b4b4) Tff7b72in Tff7b72selfTff7b72.Td2a8ffobj_idsTb4b4b4:
Tff7b72if Te6edf3page_type Tff7b72== Te6edf3SpiffsObjIndexPageTb4b4b4:
Te6edf3obj_id Tff7b72^Tff7b72= Tb4b4b4(T79c0ff1 Tff7b72<< Tb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_len Tff7b72* T79c0ff8Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3img Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3SpiffsPageTff7b72.Td2a8ff_endianness_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffendiannessTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_lenTb4b4b4]Tb4b4b4, Te6edf3obj_idTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4) Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size
Te6edf3img Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size Tff7b72- Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3img
Tff7b72def Td2a8ffmagicfyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3blocks_limTb4b4b4)Tb4b4b4: T8b949e# type: (int) -> None
T8b949e# Only use magic value if no valid obj id has been written to the spot, which is the
T8b949e# spot taken up by the last obj id on last lookup page. The parent is responsible
T8b949e# for determining which is the last lookup page and calling this function.
Te6edf3remaining Tff7b72= Tff7b72selfTff7b72.Td2a8ffobj_ids_limit
Te6edf3empty_obj_id_dict Tff7b72= Tb4b4b4{
T79c0ff1Tb4b4b4: T79c0ff0xFFTb4b4b4,
T79c0ff2Tb4b4b4: T79c0ff0xFFFFTb4b4b4,
T79c0ff4Tb4b4b4: T79c0ff0xFFFFFFFFTb4b4b4,
T79c0ff8Tb4b4b4: T79c0ff0xFFFFFFFFFFFFFFFF
Tb4b4b4}
Tff7b72if Te6edf3remaining Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3remainingTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3i Tff7b72== Te6edf3remaining Tff7b72- T79c0ff2Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffobj_idsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_calc_magicTb4b4b4(Te6edf3blocks_limTb4b4b4)Tb4b4b4, Te6edf3SpiffsObjDataPageTb4b4b4)Tb4b4b4)
Tff7b72break
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffobj_idsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3empty_obj_id_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_lenTb4b4b4]Tb4b4b4, Te6edf3SpiffsObjDataPageTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffobj_ids_limit Tff7b72-Tff7b72= T79c0ff1
Tff7b72class T56d364SpiffsObjIndexPageTb4b4b4(Te6edf3SpiffsObjPageWithIdxTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3obj_idTb4b4b4, Te6edf3span_ixTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3build_config
Tb4b4b4)Tb4b4b4: T8b949e# type: (int, int, int, str, SpiffsBuildConfig) -> None
Tffa657superTb4b4b4(Te6edf3SpiffsObjIndexPageTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3obj_idTb4b4b4, Te6edf3build_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffspan_ix Tff7b72= Te6edf3span_ix
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffsize Tff7b72= Te6edf3size
Tff7b72if Tff7b72selfTff7b72.Td2a8ffspan_ix Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpages_lim Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_INDEX_PAGES_OBJ_IDS_HEAD_LIM
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpages_lim Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_INDEX_PAGES_OBJ_IDS_LIM
Tff7b72selfTff7b72.Td2a8ffpages Tff7b72= Tffa657listTb4b4b4(Tb4b4b4) T8b949e# type: typing.List[int]
Tff7b72def Td2a8ffregister_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pageTb4b4b4)Tb4b4b4: T8b949e# type: (SpiffsObjDataPage) -> None
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpages_lim Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3SpiffsFullError
Tff7b72selfTff7b72.Td2a8ffpagesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pageTff7b72.Td2a8ffoffsetTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpages_lim Tff7b72-Tff7b72= T79c0ff1
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bytes
Te6edf3obj_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffobj_id Tff7b72^ Tb4b4b4(T79c0ff1 Tff7b72<< Tb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_len Tff7b72* T79c0ff8Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3img Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3SpiffsPageTff7b72.Td2a8ff_endianness_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffendiannessTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_lenTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffspan_ix_lenTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Te6edf3SPIFFS_PH_FLAG_LENTb4b4b4]Tb4b4b4,
Te6edf3obj_idTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffspan_ixTb4b4b4,
Te6edf3SPIFFS_PH_FLAG_USED_FINAL_INDEXTb4b4b4)
T8b949e# Add padding before the object index page specific information
Te6edf3img Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD
T8b949e# If this is the first object index page for the object, add filname, type
T8b949e# and size information
Tff7b72if Tff7b72selfTff7b72.Td2a8ffspan_ix Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3img Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3SpiffsPageTff7b72.Td2a8ff_endianness_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffendiannessTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Te6edf3SPIFFS_PH_IX_SIZE_LENTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Te6edf3SPIFFS_PH_FLAG_LENTb4b4b4]Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffsizeTb4b4b4,
Te6edf3SPIFFS_TYPE_FILETb4b4b4)
Te6edf3img Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffnameTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4) Tff7b72+ Tb4b4b4(Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff' Tff7b72* Tb4b4b4(
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_name_len Tff7b72- Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4)Tb4b4b4)
Tff7b72+ Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffmeta_len
Tff7b72+ Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PADTb4b4b4)Tb4b4b4)
T8b949e# Finally, add the page index of daa pages
Tff7b72for Te6edf3page Tff7b72in Tff7b72selfTff7b72.Td2a8ffpagesTb4b4b4:
Te6edf3page Tff7b72= Te6edf3page Tff7b72>> Tffa657intTb4b4b4(Te6edf3mathTff7b72.Td2a8fflogTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_sizeTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3img Tff7b72+Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3SpiffsPageTff7b72.Td2a8ff_endianness_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffendiannessTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_ix_lenTb4b4b4]Tb4b4b4, Te6edf3pageTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4) Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size
Te6edf3img Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size Tff7b72- Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3img
Tff7b72class T56d364SpiffsObjDataPageTb4b4b4(Te6edf3SpiffsObjPageWithIdxTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3offsetTb4b4b4, Te6edf3obj_idTb4b4b4, Te6edf3span_ixTb4b4b4, Te6edf3contentsTb4b4b4, Te6edf3build_config
Tb4b4b4)Tb4b4b4: T8b949e# type: (int, int, int, bytes, SpiffsBuildConfig) -> None
Tffa657superTb4b4b4(Te6edf3SpiffsObjDataPageTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Te6edf3obj_idTb4b4b4, Te6edf3build_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffspan_ix Tff7b72= Te6edf3span_ix
Tff7b72selfTff7b72.Td2a8ffcontents Tff7b72= Te6edf3contents
Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72= Te6edf3offset
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bytes
Te6edf3img Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Te6edf3SpiffsPageTff7b72.Td2a8ff_endianness_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffendiannessTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_id_lenTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffspan_ix_lenTb4b4b4] Tff7b72+
Te6edf3SpiffsPageTff7b72.Td2a8ff_len_dictTb4b4b4[Te6edf3SPIFFS_PH_FLAG_LENTb4b4b4]Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffobj_idTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffspan_ixTb4b4b4,
Te6edf3SPIFFS_PH_FLAG_USED_FINALTb4b4b4)
Te6edf3img Tff7b72+Tff7b72= Tff7b72selfTff7b72.Td2a8ffcontents
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4) Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size
Te6edf3img Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_size Tff7b72- Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3img
Tff7b72class T56d364SpiffsBlockTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ff_resetTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> None
Tff7b72selfTff7b72.Td2a8ffcur_obj_index_span_ix Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffcur_obj_data_span_ix Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffcur_obj_id Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffcur_obj_idx_page Tff7b72= Tff7b72None T8b949e# type: typing.Optional[SpiffsObjIndexPage]
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bixTb4b4b4, Te6edf3build_configTb4b4b4)Tb4b4b4: T8b949e# type: (int, SpiffsBuildConfig) -> None
Tff7b72selfTff7b72.Td2a8ffbuild_config Tff7b72= Te6edf3build_config
Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72= Te6edf3bix Tff7b72* Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffblock_size
Tff7b72selfTff7b72.Td2a8ffremaining_pages Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_USABLE_PAGES_PER_BLOCK
Tff7b72selfTff7b72.Td2a8ffpages Tff7b72= Tffa657listTb4b4b4(Tb4b4b4) T8b949e# type: typing.List[SpiffsPage]
Tff7b72selfTff7b72.Td2a8ffbix Tff7b72= Te6edf3bix
Te6edf3lu_pages Tff7b72= Tffa657listTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_LU_PAGES_PER_BLOCKTb4b4b4)Tb4b4b4:
Te6edf3page Tff7b72= Te6edf3SpiffsObjLuPageTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbixTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_configTb4b4b4)
Te6edf3lu_pagesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpagesTff7b72.Td2a8ffextendTb4b4b4(Te6edf3lu_pagesTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflu_page_iter Tff7b72= Tffa657iterTb4b4b4(Te6edf3lu_pagesTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflu_page Tff7b72= Tffa657nextTb4b4b4(Tff7b72selfTff7b72.Td2a8fflu_page_iterTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_resetTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_register_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pageTb4b4b4)Tb4b4b4: T8b949e# type: (TSP) -> None
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3pageTb4b4b4, Te6edf3SpiffsObjDataPageTb4b4b4)Tb4b4b4:
Tff7b72assert Tff7b72selfTff7b72.Td2a8ffcur_obj_idx_page Tff7b72is Tff7b72not Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcur_obj_idx_pageTff7b72.Td2a8ffregister_pageTb4b4b4(Te6edf3pageTb4b4b4) T8b949e# can raise SpiffsFullError
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflu_pageTff7b72.Td2a8ffregister_pageTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72except Te6edf3SpiffsFullErrorTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflu_page Tff7b72= Tffa657nextTb4b4b4(Tff7b72selfTff7b72.Td2a8fflu_page_iterTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflu_pageTff7b72.Td2a8ffregister_pageTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72except Tf85149AttributeErrorTb4b4b4: T8b949e# no next lookup page
T8b949e# Since the amount of lookup pages is pre-computed at every block instance,
T8b949e# this should never occur
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff'Ta5d6ffinvalid attempt to add page to a block when there is no more space in lookupTa5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpagesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72def Td2a8ffbegin_objTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3obj_idTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3obj_index_span_ixTff7b72=T79c0ff0Tb4b4b4, Te6edf3obj_data_span_ixTff7b72=T79c0ff0
Tb4b4b4)Tb4b4b4: T8b949e# type: (int, int, str, int, int) -> None
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffremaining_pages Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3SpiffsFullErrorTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_resetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcur_obj_id Tff7b72= Te6edf3obj_id
Tff7b72selfTff7b72.Td2a8ffcur_obj_index_span_ix Tff7b72= Te6edf3obj_index_span_ix
Tff7b72selfTff7b72.Td2a8ffcur_obj_data_span_ix Tff7b72= Te6edf3obj_data_span_ix
Te6edf3page Tff7b72= Te6edf3SpiffsObjIndexPageTb4b4b4(Te6edf3obj_idTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcur_obj_index_span_ixTb4b4b4, Te6edf3sizeTb4b4b4, Te6edf3nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_register_pageTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcur_obj_idx_page Tff7b72= Te6edf3page
Tff7b72selfTff7b72.Td2a8ffremaining_pages Tff7b72-Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffcur_obj_index_span_ix Tff7b72+Tff7b72= T79c0ff1
Tff7b72def Td2a8ffupdate_objTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3contentsTb4b4b4)Tb4b4b4: T8b949e# type: (bytes) -> None
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffremaining_pages Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72raise Te6edf3SpiffsFullErrorTb4b4b4(Tb4b4b4)
Te6edf3page Tff7b72= Te6edf3SpiffsObjDataPageTb4b4b4(Tff7b72selfTff7b72.Td2a8ffoffset Tff7b72+ Tb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpagesTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffpage_sizeTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffcur_obj_idTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcur_obj_data_span_ixTb4b4b4, Te6edf3contentsTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_register_pageTb4b4b4(Te6edf3pageTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcur_obj_data_span_ix Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffremaining_pages Tff7b72-Tff7b72= T79c0ff1
Tff7b72def Td2a8ffend_objTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> None
Tff7b72selfTff7b72.Td2a8ff_resetTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffis_fullTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bool
Tff7b72return Tff7b72selfTff7b72.Td2a8ffremaining_pages Tff7b72<Tff7b72= T79c0ff0
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3blocks_limTb4b4b4)Tb4b4b4: T8b949e# type: (int) -> bytes
Te6edf3img Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffuse_magicTb4b4b4:
Tff7b72for Tb4b4b4(Te6edf3idxTb4b4b4, Te6edf3pageTb4b4b4) Tff7b72in Tffa657enumerateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpagesTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3idx Tff7b72== Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_LU_PAGES_PER_BLOCK Tff7b72- T79c0ff1Tb4b4b4:
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3pageTb4b4b4, Te6edf3SpiffsObjLuPageTb4b4b4)
Te6edf3pageTff7b72.Td2a8ffmagicfyTb4b4b4(Te6edf3blocks_limTb4b4b4)
Te6edf3img Tff7b72+Tff7b72= Te6edf3pageTff7b72.Td2a8ffto_binaryTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3page Tff7b72in Tff7b72selfTff7b72.Td2a8ffpagesTb4b4b4:
Te6edf3img Tff7b72+Tff7b72= Te6edf3pageTff7b72.Td2a8ffto_binaryTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4) Tff7b72<Tff7b72= Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffblock_size
Te6edf3img Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffblock_size Tff7b72- Tffa657lenTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3img
Tff7b72class T56d364SpiffsFSTb4b4b4(Tffa657objectTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3img_sizeTb4b4b4, Te6edf3build_configTb4b4b4)Tb4b4b4: T8b949e# type: (int, SpiffsBuildConfig) -> None
Tff7b72if Te6edf3img_size Tff7b72% Te6edf3build_configTff7b72.Td2a8ffblock_size Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff'Ta5d6ffimage size should be a multiple of block sizeTa5d6ff'Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffimg_size Tff7b72= Te6edf3img_size
Tff7b72selfTff7b72.Td2a8ffbuild_config Tff7b72= Te6edf3build_config
Tff7b72selfTff7b72.Td2a8ffblocks Tff7b72= Tffa657listTb4b4b4(Tb4b4b4) T8b949e# type: typing.List[SpiffsBlock]
Tff7b72selfTff7b72.Td2a8ffblocks_lim Tff7b72= Tff7b72selfTff7b72.Td2a8ffimg_size Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffblock_size
Tff7b72selfTff7b72.Td2a8ffremaining_blocks Tff7b72= Tff7b72selfTff7b72.Td2a8ffblocks_lim
Tff7b72selfTff7b72.Td2a8ffcur_obj_id Tff7b72= T79c0ff1 T8b949e# starting object id
Tff7b72def Td2a8ff_create_blockTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> SpiffsBlock
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_fullTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3SpiffsFullErrorTb4b4b4(Ta5d6ff'Ta5d6ffthe image size has been exceededTa5d6ff'Tb4b4b4)
Te6edf3block Tff7b72= Te6edf3SpiffsBlockTb4b4b4(Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffblocksTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_configTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffblocksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3blockTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremaining_blocks Tff7b72-Tff7b72= T79c0ff1
Tff7b72return Te6edf3block
Tff7b72def Td2a8ffis_fullTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bool
Tff7b72return Tff7b72selfTff7b72.Td2a8ffremaining_blocks Tff7b72<Tff7b72= T79c0ff0
Tff7b72def Td2a8ffcreate_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3img_pathTb4b4b4, Te6edf3file_pathTb4b4b4)Tb4b4b4: T8b949e# type: (str, str) -> None
Tff7b72if Tffa657lenTb4b4b4(Te6edf3img_pathTb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffobj_name_lenTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffobject name Ta5d6ff'Tffd700%sTa5d6ff'Ta5d6ff too longTa5d6ff" Tff7b72% Te6edf3img_pathTb4b4b4)
Te6edf3name Tff7b72= Te6edf3img_path
Tff7b72with Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3objTb4b4b4:
Te6edf3contents Tff7b72= Te6edf3objTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3stream Tff7b72= Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Te6edf3contentsTb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3block Tff7b72= Tff7b72selfTff7b72.Td2a8ffblocksTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Te6edf3blockTff7b72.Td2a8ffbegin_objTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcur_obj_idTb4b4b4, Tffa657lenTb4b4b4(Te6edf3contentsTb4b4b4)Tb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149IndexErrorTb4b4b4, Te6edf3SpiffsFullErrorTb4b4b4)Tb4b4b4:
Te6edf3block Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_blockTb4b4b4(Tb4b4b4)
Te6edf3blockTff7b72.Td2a8ffbegin_objTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcur_obj_idTb4b4b4, Tffa657lenTb4b4b4(Te6edf3contentsTb4b4b4)Tb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3contents_chunk Tff7b72= Te6edf3streamTff7b72.Td2a8ffreadTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_DATA_PAGE_CONTENT_LENTb4b4b4)
Tff7b72while Te6edf3contents_chunkTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3block Tff7b72= Tff7b72selfTff7b72.Td2a8ffblocksTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72tryTb4b4b4:
T8b949e# This can fail because either (1) all the pages in block have been
T8b949e# used or (2) object index has been exhausted.
Te6edf3blockTff7b72.Td2a8ffupdate_objTb4b4b4(Te6edf3contents_chunkTb4b4b4)
Tff7b72except Te6edf3SpiffsFullErrorTb4b4b4:
T8b949e# If its (1), use the outer exception handler
Tff7b72if Te6edf3blockTff7b72.Td2a8ffis_fullTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3SpiffsFullError
T8b949e# If its (2), write another object index page
Te6edf3blockTff7b72.Td2a8ffbegin_objTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcur_obj_idTb4b4b4, Tffa657lenTb4b4b4(Te6edf3contentsTb4b4b4)Tb4b4b4, Te6edf3nameTb4b4b4,
Te6edf3obj_index_span_ixTff7b72=Te6edf3blockTff7b72.Td2a8ffcur_obj_index_span_ixTb4b4b4,
Te6edf3obj_data_span_ixTff7b72=Te6edf3blockTff7b72.Td2a8ffcur_obj_data_span_ixTb4b4b4)
Tff7b72continue
Tff7b72except Tb4b4b4(Tf85149IndexErrorTb4b4b4, Te6edf3SpiffsFullErrorTb4b4b4)Tb4b4b4:
T8b949e# All pages in the block have been exhausted. Create a new block, copying
T8b949e# the previous state of the block to a new one for the continuation of the
T8b949e# current object
Te6edf3prev_block Tff7b72= Te6edf3block
Te6edf3block Tff7b72= Tff7b72selfTff7b72.Td2a8ff_create_blockTb4b4b4(Tb4b4b4)
Te6edf3blockTff7b72.Td2a8ffcur_obj_id Tff7b72= Te6edf3prev_blockTff7b72.Td2a8ffcur_obj_id
Te6edf3blockTff7b72.Td2a8ffcur_obj_idx_page Tff7b72= Te6edf3prev_blockTff7b72.Td2a8ffcur_obj_idx_page
Te6edf3blockTff7b72.Td2a8ffcur_obj_data_span_ix Tff7b72= Te6edf3prev_blockTff7b72.Td2a8ffcur_obj_data_span_ix
Te6edf3blockTff7b72.Td2a8ffcur_obj_index_span_ix Tff7b72= Te6edf3prev_blockTff7b72.Td2a8ffcur_obj_index_span_ix
Tff7b72continue
Te6edf3contents_chunk Tff7b72= Te6edf3streamTff7b72.Td2a8ffreadTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffOBJ_DATA_PAGE_CONTENT_LENTb4b4b4)
Te6edf3blockTff7b72.Td2a8ffend_objTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcur_obj_id Tff7b72+Tff7b72= T79c0ff1
Tff7b72def Td2a8ffto_binaryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: T8b949e# type: () -> bytes
Te6edf3img Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'
Te6edf3all_blocks Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3block Tff7b72in Tff7b72selfTff7b72.Td2a8ffblocksTb4b4b4:
Te6edf3all_blocksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3blockTff7b72.Td2a8ffto_binaryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffblocks_limTb4b4b4)Tb4b4b4)
Te6edf3bix Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffblocksTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffuse_magicTb4b4b4:
T8b949e# Create empty blocks with magic numbers
Tff7b72while Tff7b72selfTff7b72.Td2a8ffremaining_blocks Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3block Tff7b72= Te6edf3SpiffsBlockTb4b4b4(Te6edf3bixTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_configTb4b4b4)
Te6edf3all_blocksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3blockTff7b72.Td2a8ffto_binaryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffblocks_limTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremaining_blocks Tff7b72-Tff7b72= T79c0ff1
Te6edf3bix Tff7b72+Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
T8b949e# Just fill remaining spaces FF's
Te6edf3all_blocksTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ffbTa5d6ff'Tffea00\xFFTa5d6ff' Tff7b72* Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffimg_size Tff7b72- Tffa657lenTb4b4b4(Te6edf3all_blocksTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffbuild_configTff7b72.Td2a8ffblock_sizeTb4b4b4)Tb4b4b4)
Te6edf3img Tff7b72+Tff7b72= Ta5d6ffbTa5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Te6edf3blk Tff7b72for Te6edf3blk Tff7b72in Te6edf3all_blocksTb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3img
Tff7b72class T56d364CustomHelpFormatterTb4b4b4(Te6edf3argparseTff7b72.Td2a8ffHelpFormatterTb4b4b4)Tb4b4b4:
T8b949e"""
Similar to argparse.ArgumentDefaultsHelpFormatter, except it
doesn't add the default value if "(default:" is already present.
This helps in the case of options with action="store_false", like
--no-magic or --no-magic-len.
"""
Tff7b72def Td2a8ff_get_help_stringTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3actionTb4b4b4)Tb4b4b4: T8b949e# type: (argparse.Action) -> str
Tff7b72if Te6edf3actionTff7b72.Td2a8ffhelp Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff'
Tff7b72if Ta5d6ff'Ta5d6ff%Ta5d6ff(default)Ta5d6ff' Tff7b72not Tff7b72in Te6edf3actionTff7b72.Td2a8ffhelp Tff7b72and Ta5d6ff'Ta5d6ff(default:Ta5d6ff' Tff7b72not Tff7b72in Te6edf3actionTff7b72.Td2a8ffhelpTb4b4b4:
Tff7b72if Te6edf3actionTff7b72.Td2a8ffdefault Tff7b72is Tff7b72not Te6edf3argparseTff7b72.Td2a8ffSUPPRESSTb4b4b4:
Te6edf3defaulting_nargs Tff7b72= Tb4b4b4[Te6edf3argparseTff7b72.Td2a8ffOPTIONALTb4b4b4, Te6edf3argparseTff7b72.Td2a8ffZERO_OR_MORETb4b4b4]
Tff7b72if Te6edf3actionTff7b72.Td2a8ffoption_strings Tff7b72or Te6edf3actionTff7b72.Td2a8ffnargs Tff7b72in Te6edf3defaulting_nargsTb4b4b4:
Tff7b72return Te6edf3actionTff7b72.Td2a8ffhelp Tff7b72+ Ta5d6ff'Ta5d6ff (default: Tffd700%(default)sTa5d6ff)Ta5d6ff'
Tff7b72return Te6edf3actionTff7b72.Td2a8ffhelp
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4: T8b949e# type: () -> None
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff'Ta5d6ffSPIFFS Image GeneratorTa5d6ff'Tb4b4b4,
Te6edf3formatter_classTff7b72=Te6edf3CustomHelpFormatterTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ffimage_sizeTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffSize of the created imageTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ffbase_dirTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffPath to directory from which the image will be createdTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ffoutput_fileTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffCreated image output file pathTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--page-sizeTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffLogical page size. Set to value same as CONFIG_SPIFFS_PAGE_SIZE.Ta5d6ff'Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3defaultTff7b72=T79c0ff256Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--block-sizeTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffLogical block size. Set to the same value as the flash chipTa5d6ff'Ta5d6ffs sector size (g_rom_flashchip.sector_size).Ta5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3defaultTff7b72=T79c0ff4096Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--obj-name-lenTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffFile full path maximum length. Set to value same as CONFIG_SPIFFS_OBJ_NAME_LEN.Ta5d6ff'Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3defaultTff7b72=T79c0ff32Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--meta-lenTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffFile metadata length. Set to value same as CONFIG_SPIFFS_META_LENGTH.Ta5d6ff'Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3defaultTff7b72=T79c0ff4Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--use-magicTa5d6ff'Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff'Ta5d6ffuse_magicTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffUse magic number to create an identifiable SPIFFS image. Specify if CONFIG_SPIFFS_USE_MAGIC.Ta5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--no-magicTa5d6ff'Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff'Ta5d6ffuse_magicTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffInverse of --use-magic (default: --use-magic is enabled)Ta5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_falseTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--use-magic-lenTa5d6ff'Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff'Ta5d6ffuse_magic_lenTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffUse position in memory to create different magic numbers for each block. Specify if CONFIG_SPIFFS_USE_MAGIC_LENGTH.Ta5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--no-magic-lenTa5d6ff'Tb4b4b4,
Te6edf3destTff7b72=Ta5d6ff'Ta5d6ffuse_magic_lenTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffInverse of --use-magic-len (default: --use-magic-len is enabled)Ta5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_falseTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--follow-symlinksTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffTake into account symbolic links during partition image creation.Ta5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--big-endianTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffSpecify if the target architecture is big-endian. If not specified, little-endian is assumed.Ta5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--aligned-obj-ix-tablesTa5d6ff'Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffUse aligned object index tables. Specify if SPIFFS_ALIGNED_OBJECT_INDEX_TABLES is set.Ta5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffset_defaultsTb4b4b4(Te6edf3use_magicTff7b72=Tff7b72TrueTb4b4b4, Te6edf3use_magic_lenTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3argsTff7b72.Td2a8ffbase_dirTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff'Ta5d6ffgiven base directory Tffd700%sTa5d6ff does not existTa5d6ff' Tff7b72% Te6edf3argsTff7b72.Td2a8ffbase_dirTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3argsTff7b72.Td2a8ffoutput_fileTb4b4b4, Ta5d6ff'Ta5d6ffwbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3image_fileTb4b4b4:
Te6edf3image_size Tff7b72= Tffa657intTb4b4b4(Te6edf3argsTff7b72.Td2a8ffimage_sizeTb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3spiffs_build_default Tff7b72= Te6edf3SpiffsBuildConfigTb4b4b4(Te6edf3argsTff7b72.Td2a8ffpage_sizeTb4b4b4, Te6edf3SPIFFS_PAGE_IX_LENTb4b4b4,
Te6edf3argsTff7b72.Td2a8ffblock_sizeTb4b4b4, Te6edf3SPIFFS_BLOCK_IX_LENTb4b4b4, Te6edf3argsTff7b72.Td2a8ffmeta_lenTb4b4b4,
Te6edf3argsTff7b72.Td2a8ffobj_name_lenTb4b4b4, Te6edf3SPIFFS_OBJ_ID_LENTb4b4b4, Te6edf3SPIFFS_SPAN_IX_LENTb4b4b4,
Tff7b72TrueTb4b4b4, Tff7b72TrueTb4b4b4, Ta5d6ff'Ta5d6ffbigTa5d6ff' Tff7b72if Te6edf3argsTff7b72.Td2a8ffbig_endian Tff7b72else Ta5d6ff'Ta5d6fflittleTa5d6ff'Tb4b4b4,
Te6edf3argsTff7b72.Td2a8ffuse_magicTb4b4b4, Te6edf3argsTff7b72.Td2a8ffuse_magic_lenTb4b4b4, Te6edf3argsTff7b72.Td2a8ffaligned_obj_ix_tablesTb4b4b4)
Te6edf3spiffs Tff7b72= Te6edf3SpiffsFSTb4b4b4(Te6edf3image_sizeTb4b4b4, Te6edf3spiffs_build_defaultTb4b4b4)
Tff7b72for Te6edf3rootTb4b4b4, Te6edf3dirsTb4b4b4, Te6edf3files Tff7b72in Te6edf3osTff7b72.Td2a8ffwalkTb4b4b4(Te6edf3argsTff7b72.Td2a8ffbase_dirTb4b4b4, Te6edf3followlinksTff7b72=Te6edf3argsTff7b72.Td2a8fffollow_symlinksTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3f Tff7b72in Te6edf3filesTb4b4b4:
Te6edf3full_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3fTb4b4b4)
Te6edf3spiffsTff7b72.Td2a8ffcreate_fileTb4b4b4(Ta5d6ff'Ta5d6ff/Ta5d6ff' Tff7b72+ Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrelpathTb4b4b4(Te6edf3full_pathTb4b4b4, Te6edf3argsTff7b72.Td2a8ffbase_dirTb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff'Tffea00\\Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4)Tb4b4b4, Te6edf3full_pathTb4b4b4)
Te6edf3image Tff7b72= Te6edf3spiffsTff7b72.Td2a8ffto_binaryTb4b4b4(Tb4b4b4)
Te6edf3image_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3imageTb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff'Ta5d6ff__main__Ta5d6ff'Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────